package com.gitee.cui.server.server;

import com.gitee.cui.common.common.bean.User;
import com.gitee.cui.common.util.Logger;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

/**
 * session内存
 * @author cuiqingqiang
 * @version 1.0
 * @date 2021/10/28 9:18
 **/
@Slf4j
@Data
public class SessionMap {

    private SessionMap() {}

    private static final SessionMap instance = new SessionMap();

    public static SessionMap inst() {
        return instance;
    }

    /**
     * sessionId和session对象的关系
     */
    private ConcurrentHashMap<String, ServerSession> map = new ConcurrentHashMap<>();

    /**
     * 向缓存中添加session信息
     * @param session session信息
     */
    public void addSession(ServerSession session) {
        map.put(session.getSessionId(), session);
        log.info("用户登录，id={}, 在线总数：{}", session.getUser().getUid(), map.size());
    }

    /**
     * 判断用户是否已经登录
     * @param user 用户信息
     * @return 用户是否登录
     */
    public boolean hasLogin(User user) {
        Set<Map.Entry<String, ServerSession>> entries = map.entrySet();
        Iterator<Map.Entry<String, ServerSession>> it = entries.iterator();
        while (it.hasNext()) {
            ServerSession session = it.next().getValue();
            User sessionUser = session.getUser();
            if (sessionUser.getUid().equals(user.getUid()) && sessionUser.getPlatform().equals(user.getPlatform())) {
                return true;
            }
        }
        return false;
    }

    /**
     * 根据sessionId，从缓存中清楚session
     * @param sessionId key
     */
    public void removeSession(String sessionId) {
        ServerSession session = map.remove(sessionId);
        if (session != null) {
            Logger.tcfo("用户下线，id= " + session.getUser().getUid() + "，在线总数：" + map.size());
        }
    }

    /**
     * 从session中根据uid找到需要发送给对方的session信息
     * @param uid 用户id
     * @return 接收消息用的session信息
     */
    public List<ServerSession> getSessionsByUid(String uid) {
        List<ServerSession> result = new ArrayList<>();
        Iterator<Map.Entry<String, ServerSession>> it = map.entrySet().iterator();
        while (it.hasNext()) {
            ServerSession session = it.next().getValue();
            // 一个用户可以有多个会话，因为通过不同的终端登录，每个中断都需要能够接收到转发的消息
            if (uid.equals(session.getUser().getUid())) {
                result.add(session);
            }
        }
        return result;
    }
}
